最短路径
在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,把路径长度最短(即经过的边数最少)的那条路径叫作最短路径或者最短距离。
对于带权的图,考虑路径上各边的权值,则通常把一条路径上所经边的权值之和定义为该路径的路径长度或带权路径长度。从源点到终点可能不止一条路径,把带权路径长度最短的那条路径称为最短路径,其路径长度(权值之和)称为最短路径长度或最短距离。
最短路径算法
Dijkstra算法 该算法是用于求解单源点最短路径的实用算法
Dijkstra算法的基本思想如下:
设置并逐步扩充一个集合S,存放已求出其最短路径的顶点,则尚未确定最短路径的顶点集合是V-S其中,V为网中所有顶点集合。按最短路径长度递增的顺序逐个用V-S中的顶点加到S中,直到S中包含全部顶点,而V-S为空。
Dijkstra算法的具体步骤;
(1)设源点为V,则S中只包含顶点V,令W=V-S,则W中包含除V外图中所有顶点。V对应的距离值为0,即D[1]=0。W中顶点对应的距离值是这样规定的:若图中有弧,则V顶点的距离为此弧权值,否则为(一个无穷大的数);
(2)从W中选择一个其距离值最小的顶点,并加入到S中;
(3)每往S中加入一个顶点后,就要对W中各个顶点的距离值进行一次修改。若加进做中间顶点,使+的值小于值,则用+代替原来的距离值;
(4)重复步骤2和3,即在修改过的W中的选距离值最小的顶点加入到S中,并修改W中的各个顶点的距离值,如此进行下去,知道S中包含图中所有顶点为之,即S=V。这是D[N]就是从到的最短路径长度值。
Floyd算法 该算法能够求得任意顶点之间的最短路径。
Floyd算法的基本思想是:
任意2个顶点到的距离的带权邻接矩阵开始,每次插入一个顶点,然后将到间的已知最短路径与插入顶点作为中间顶点时可能产生的到路径距离比较,取较小值以得到新的距离矩阵.如此循环迭代下去,依次构造出N个矩阵,,…,,当所有的顶点均作为任意 2个顶点到中间顶点时得到的最后的带权邻接矩阵就反映了所有顶点对之间的最短距离信息,成为图G的距离矩阵。
构造图G的距离矩阵:
设G是n个顶点的图,且其顶点用从1到n的整数编号。
(1)把G的带权邻接矩阵D作为距离矩阵的初值,即==D。当两点之间有边时, 等于边的权;当两点之间没有边时,记为无穷大;当i=j时,=0.
(2)构造=,其中=min(,+)是从到的只允许以作为中间点的路径中最短路的长度。
(3)继续构造,其中2≤k≤n,其中=min(,+)是从